package com.solr.demo;

import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

public class solrDemo {

	//###############################添加###################################
	//向索引库中添加索引
	@Test
	public void addDocument() throws Exception
	{
		//和solr建立连接
		//地址就是放在Tomcat里的访问solr的首页地址
		SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
		
		//创建一个文档对象
		SolrInputDocument document = new SolrInputDocument();
		
		//向文档中添加域
		//第一个参数：域的名称，域的名称必须是在schema.xml中定义的
		//第二个参数：域的值
		document.addField("id", "id6666");
		document.addField("title_ik", "使用solrJ添加的文档66666666");	
		document.addField("product_name", "商品名称");
		
		//把document对象添加到索引库中
		solrServer.add(document);
		//提交修改
		solrServer.commit();
		
	}
	
	
	//##############################删除#########################################
	//删除文档，根据id删除
		@Test
		public void deleteDocumentByid() throws Exception {
			//创建连接默认是使用collection1这个索引库
			SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
			//根据id删除文档
			solrServer.deleteById("c0001");
			//提交修改
			solrServer.commit();
		}
		
		//根据查询条件删除文档
		@Test
		public void deleteDocumentByQuery() throws Exception {
			//创建连接
			SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
			//根据查询条件删除文档
			solrServer.deleteByQuery("*:*");
			//提交修改
			solrServer.commit();
		}
	
		//####################修改更新##############################
	//和添加一样,只要id一致就直接更新
		@Test
		public void updateDocument() throws Exception
		{
	
			SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
			SolrInputDocument document = new SolrInputDocument();
			document.addField("id", "id6666");
			document.addField("title_ik", "new>>>>>>>>>>>使用solrJ添加的文档");	
			document.addField("product_name", "new>>>>>>>>>>商品名称");
		
			solrServer.add(document);
		
			solrServer.commit();
			
		}
		
		//##########################简单查询###############################
		//查询索引
		@Test
		public void queryIndex() throws Exception {
			//创建连接
			SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
			//创建一个query对象
			SolrQuery query = new SolrQuery();
			//设置查询条件
			query.setQuery("*:*");//默认只能查询10条
			//执行查询
			QueryResponse queryResponse = solrServer.query(query);
			//取查询结果
			SolrDocumentList solrDocumentList = queryResponse.getResults();
			//共查询到商品数量
			System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
			//遍历查询的结果
			for (SolrDocument solrDocument : solrDocumentList) {
				System.out.println(solrDocument.get("id"));
				System.out.println(solrDocument.get("product_name"));
				System.out.println(solrDocument.get("product_price"));
				System.out.println(solrDocument.get("product_catalog_name"));
				System.out.println(solrDocument.get("product_picture"));
				
			}
		}
		
		//######################复杂多条件查询##########################
		@Test
		public void queryIndex2() throws Exception
		{
			//创建连接
			SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
			//创建一个query对象
			SolrQuery query = new SolrQuery();
			
			//设置主查询条件
			query.setQuery("内裤");
			
			//设置主查询条件,如果只有一个查询条件(通过一个关键字搜索一个域时设置----------------------------------)
			//query.setQuery("product_name:内裤");
			
			
			//设置各种过滤条件
			
			// 设置过滤条件  价格区间
			query.addFilterQuery("product_price:[10 TO 20]");
			// 设置过滤条件 排序
			query.setSort("product_price", ORDER.desc);
			// 设置 分页
			query.setStart(0);//page-1 * rows
			query.setRows(100);
			
			// 设置要显示的字段
			query.setFields("id","product_name","product_price","product_catalog_name");
			
			//4.5设置默认的搜索域(一般为多个搜索域的copy域)(通过一个关键字搜索多个域时设置----------------------------------)
			//df是搜索域用的默认值
			query.set("df", "product_keywords");
			
			//高亮显示
			query.setHighlight(true);
			//高亮显示的域
			query.addHighlightField("product_name");
			//高亮显示的前缀
			query.setHighlightSimplePre("<em>");
			//高亮显示的后缀
			query.setHighlightSimplePost("</em>");
			//执行查询
			QueryResponse queryResponse = solrServer.query(query);
			//取查询结果
			SolrDocumentList solrDocumentList = queryResponse.getResults();
			//共查询到商品数量
			System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
			//遍历查询的结果
			for (SolrDocument solrDocument : solrDocumentList) {
				System.out.println(solrDocument.get("id"));
				//取高亮显示
				String productName = "";
				Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
				List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
				//判断是否有高亮内容
				if (null != list) {
					productName = list.get(0);
				} else {
					productName = (String) solrDocument.get("product_name");
				}
				
				System.out.println(productName);
				System.out.println(solrDocument.get("product_price"));
				System.out.println(solrDocument.get("product_catalog_name"));
				System.out.println(solrDocument.get("product_picture"));
				
			}
			
			
		}
		
		
		
	
}
